package com.estatistica.controle;

import java.text.DecimalFormat;

import com.estatistica.entidade.DadosPopulacao;
import com.estatistica.util.Util;

public class PopulacaoControle {

	private DadosPopulacao dadosPopulacao;

	public DadosPopulacao getDadosPopulacao() {
		return dadosPopulacao;
	}

	public void setDadosPopulacao(DadosPopulacao dadosPopulacao) {
		this.dadosPopulacao = dadosPopulacao;
	}

	public String getMedia(int[] dados, int total) {
		double soma = 0;
		for (int i = 0; i < dados.length; i++) {
			soma += dados[i];
		}
		return new DecimalFormat(Util.TRES_CASAS).format(soma / total);
	}

	public String getMediaGeometrica(int[] dados, int n) {
		double produto = 1;
		for (int i = 0; i < n; i++) {
			produto *= dados[i];
		}
		return new DecimalFormat(Util.TRES_CASAS).format(Math.pow(produto,
				(1.0 / n)));
	}

	public String getDesvioPadrao(int[] dados, String media, int total) {
		double desvio = 0, desvio2 = 0.0;
		double mediaD = getValorDouble(media);
		for (int i = 0; i < total; i++) {
			desvio = (double) dados[i] - mediaD;
			desvio2 += (desvio * desvio);
		}
		return new DecimalFormat(Util.TRES_CASAS).format(Math.sqrt(desvio2 / total));
	}

	public String getVariancia(String desvioP) {
		return new DecimalFormat(Util.TRES_CASAS).format(Math.pow(getValorDouble(desvioP), 2.0));
	}

	public String getCoefVariacao(String desvio, String media) {
		return new DecimalFormat(Util.TRES_CASAS).format(100 * getValorDouble(desvio) / getValorDouble(media));
	}

	private Double getValorDouble(String valor) {
		return Double.parseDouble(valor.replace(',', '.'));
	}

	public String getMediana(int[] dados, int n) {
		double valor = 0;
		if (n % 2 != 0) {
			valor = dados[n / 2];
		} else {
			valor = (dados[n / 2] + dados[n / 2 - 1]) / 2.0;
		}
		return new DecimalFormat(Util.TRES_CASAS).format(valor);
	}

	public String getModa(int[] dados, int n) {
		String saida = "";
		int maxValue = dados[n - 1] + 1;
		int count[] = new int[maxValue], maior = 0;
		for (int i = 0; i < n; i++) {
			count[dados[i]]++;
			maior = (count[dados[i]] > maior) ? count[dados[i]] : maior;
		}
		if (maior == 1) {
			saida = "Amodal";
		} else {
			for (int i = 0; i < maxValue; i++) {
				if (count[i] == maior) {
					saida += i + " ";
				}
			}
		}
		return saida;
	}

}
